昨天我們簡單使用過帳號註冊、登入、登出等功能,今天將讓系統功能瀏覽時,必須要登入後才能夠瀏覽,也就是後端的流程跑到 Action 前,必須要有身分驗證擋著,身分驗證通過,才可執行 Action 內容。
在 Day12 Life Cycle 生命週期 的內容有提到 Middleware,如果要簡單了解一下 Middleware,可以看一下 Day12 這篇~
而在系統導入身分驗證會使用到 UseAuthorization()
與 UseAuthentication()
這兩個 Middleware,先來說說 UseAuthorization()
UseAuthentication()
提供系統去判斷使用者是否有權限去執行限定的資源,e.g. 未登入時,是否有權限瀏覽 Events 的 Index 頁面;登入後,是否有權限瀏覽活動建立的頁面。
簡單來說,UseAuthentication()
主要功能為「驗證使用者」以及「如果該使用者未通過驗證,該做甚麼例外處理。」
而通過 UseAuthentication()
後,會再呼叫指定的擴充方法來將使用者資訊、驗證資訊等進行額外處理,e.g. JWT、Cookies 等擴充方法。
若系統是導入 ASP.NET Core Identity 驗證框架,則 UseAuthentication()
是不用手動加入 Startup.cs,ASP.NET Core Identity 預設會將此 Middleware 放在自己的框架後端執行。
UseAuthorization()
則是提供指定使用者在經過驗證後,能夠執行哪些功能,簡單說就是權限。
e.g. 系統管理員經過驗證(UseAuthentication())後,UseAuthorization()
藉由 Filter 來判斷系統管理員需被套用最高權限規則,並可使用所有系統功能。
UseAuthorization()
前必須先經過 UseAuthentication()
的處理。
要讓頁面必須是登入後才能瀏覽的作法很簡單,只要加上 [Authorize]
這一個 Attribute 加到 Controller 或是指定的 Action 即可。
若是活動頁面皆須登入後才可瀏覽,則可在 EventsController
最前方的 Code 加入 [Authorize]
:
[Authorize]
public class EventsController : Controller
點擊「活動建立」時,頁面導向至登入畫面,而不是 Events 的 Index,且可以看到 URL 最後帶著 ReturnUrl
的參數,於是登入後會導向至 Events 的 Index。
若今天僅在活動建立(Create)才需登入時,則在 Action 前方加入 [Authorize]
:
[Authorize]
public IActionResult Create()
現在 Index 可以不登入就瀏覽了:
但點擊 Create 的超連結時,就會跳轉到 Login:
這時可以將 [Authorize]
放在 Controller 最前方,並在 Index 前加入 [AllowAnonymous]
:
[AllowAnonymous]
public IActionResult Index()
如此就可以只讓 Index 不須登入即可瀏覽。
今天也了解了身分驗證大概的運作流程,接下來到鐵人賽結束都可以好好專注在身分權限以及活動報名的功能邏輯上。
不知不覺鐵人賽剩一周就要結束了,必須堅持到最後啊!
ASP.NET Core驗證概觀
ASP.NET Core授權簡介
使用受授權保護的使用者資料建立 ASP.NET Core Web 應用程式
ASP.NET Core 中介軟體
[Day22] 身份驗證與授權 - 我與 ASP.NET Core 3 的 30天